package subraSoft.fenix.model.reparacion.service.impl;

import java.util.ArrayList;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;

import subraSoft.centaurus.model.cobj.CenDefaultCObj;
import subraSoft.centaurus.model.domain.CenDefaultDO;
import subraSoft.centaurus.model.service.CenIABMService;
import subraSoft.centaurus.model.service.CenIPaginableService;
import subraSoft.centaurus.model.service.impl.CenDefaultServiceImpl;
import subraSoft.fenix.model.authentication.domain.FenPerfilDO;
import subraSoft.fenix.model.cliente.domain.FenClienteDO;
import subraSoft.fenix.model.reparacion.cobj.FenReparacionCObj;
import subraSoft.fenix.model.reparacion.cobj.FenReparacionQueryCObj;
import subraSoft.fenix.model.reparacion.domain.FenReparacionDO;
import subraSoft.fenix.model.reparacion.service.FenReparacionService;

public class FenReparacionServiceImpl extends CenDefaultServiceImpl 
	implements FenReparacionService, CenIABMService, CenIPaginableService {

	public Long saveOrUpdate(CenDefaultCObj data)
	{
		Session session = sessionFactory.getCurrentSession();
		session.beginTransaction();
		
		FenReparacionCObj repCObj = (FenReparacionCObj)data;
		FenReparacionDO repDO;
		if(data.getId() == null)
		{
			repDO = new FenReparacionDO();
		}
		else
		{
			repDO = (FenReparacionDO) session.load(FenReparacionDO.class, (Long)data.getId());
		}
		
		repDO.setAccesorios(repCObj.getAccesorios());
		repDO.setEquipo(repCObj.getEquipo());
		repDO.setFechaCreacion(repCObj.getFechaCreacion());
		repDO.setFechaEntrega(repCObj.getFechaEntrega());
		repDO.setFechaFinalizacion(repCObj.getFechaFinalizacion());
		repDO.setId(repCObj.getId());
		repDO.setMarca(repCObj.getMarca());
		repDO.setObservaciones(repCObj.getObservaciones());
		repDO.setPedido(repCObj.getPedido());
		repDO.setPrecio(repCObj.getPrecio());
		repDO.setRealizado(repCObj.getRealizado());
		repDO.setSerie(repCObj.getSerie());
		
		// SETEAR CLIENTE ASOCIADO
		FenClienteDO cliDO = (FenClienteDO)session.get(FenClienteDO.class, repCObj.getIdCliente());
		repDO.setCliente(cliDO);
		
		session.saveOrUpdate(repDO);
		
		session.getTransaction().commit();
		
		return repDO.getId();
	}

	@SuppressWarnings("unchecked")
	public List<CenDefaultCObj> getList()
	{
		Session session = sessionFactory.getCurrentSession();
		session.beginTransaction();
		
		List<CenDefaultCObj> res = new ArrayList<CenDefaultCObj>();
		Criteria c = session.createCriteria(FenReparacionDO.class);
		
		List<CenDefaultDO> clientes = c.list();
		
		for (CenDefaultDO fenReparacionDO : clientes) 
		{
			res.add(getCObj((FenReparacionDO) fenReparacionDO));
		}
		
		session.getTransaction().commit();
		return res;
	}
	
	private CenDefaultCObj getCObj(FenReparacionDO reparacionDO)
	{
		FenReparacionCObj reparacionCObj = new FenReparacionCObj();
		reparacionCObj.setAccesorios(reparacionDO.getAccesorios());
		reparacionCObj.setEquipo(reparacionDO.getEquipo());
		reparacionCObj.setFechaCreacion(reparacionDO.getFechaCreacion());
		reparacionCObj.setFechaEntrega(reparacionDO.getFechaEntrega());
		reparacionCObj.setFechaFinalizacion(reparacionDO.getFechaFinalizacion());
		reparacionCObj.setId(reparacionDO.getId());
		reparacionCObj.setMarca(reparacionDO.getMarca());
		reparacionCObj.setObservaciones(reparacionDO.getObservaciones());
		reparacionCObj.setPedido(reparacionDO.getPedido());
		reparacionCObj.setPrecio(reparacionDO.getPrecio());
		reparacionCObj.setRealizado(reparacionDO.getRealizado());
		reparacionCObj.setSerie(reparacionDO.getSerie());
		reparacionCObj.setIdCliente(reparacionDO.getCliente().getId());
		reparacionCObj.setVersion(reparacionDO.getVersion());
		return reparacionCObj;
	}

	public void delete(CenDefaultCObj rep)
	{
		Session session = sessionFactory.getCurrentSession();
		session.beginTransaction();
		
		CenDefaultDO re = (CenDefaultDO) session.load(FenReparacionDO.class, (Long)rep.getId());
		session.delete(re);
		
		session.getTransaction().commit();
	}

	@SuppressWarnings("unchecked")
	public List<CenDefaultCObj> getReparacionesBy(FenReparacionQueryCObj repQ) {
		
		Session session = sessionFactory.getCurrentSession();
		session.beginTransaction();
		
		List<CenDefaultCObj> res = new ArrayList<CenDefaultCObj>();
		Criteria c = session.createCriteria(FenReparacionDO.class);
		if(repQ.getId() != null)
			c.add( Restrictions.eq("id", repQ.getId()) );
		
		if(repQ.getCreF() != null)
			c.add( Restrictions.le("fechaCreacion", repQ.getCreF()));
		if(repQ.getCreI() != null)
			c.add( Restrictions.ge("fechaCreacion", repQ.getCreI()));		
		
		if(repQ.getFinF() != null)
			c.add( Restrictions.le("fechaFinalizacion", repQ.getFinF()));
		if(repQ.getFinI() != null)
			c.add( Restrictions.ge("fechaFinalizacion", repQ.getFinI()));	
		
		if(repQ.getEntF() != null)
			c.add( Restrictions.le("fechaEntrega", repQ.getEntF()));
		if(repQ.getEntI() != null)
			c.add( Restrictions.ge("fechaEntrega", repQ.getEntI()));	
		
		if(repQ.getIdCli() != null)
			c.add( Restrictions.eq("cliente.id", repQ.getIdCli()) );
		
		if(repQ.getEquipo() != null)
			c.add( Restrictions.eq("equipo", repQ.getEquipo()) );
		
		if(repQ.getSerie() != null)
			c.add( Restrictions.eq("serie", repQ.getSerie()) );
		
		if(repQ.getMarca() != null)
			c.add( Restrictions.eq("marca", repQ.getMarca()) );
		
		if(repQ.getAccesorios() != null)
			c.add( Restrictions.like("accesorios", "%"+repQ.getAccesorios()+"%") );
		
		if(repQ.getPedido() != null)
			c.add( Restrictions.eq("pedido", repQ.getPedido()) );
		
		if(repQ.getRealizado() != null)
			c.add( Restrictions.eq("realizado", repQ.getRealizado()) );
		
		if(repQ.getPrecio() != null)
			c.add( Restrictions.eq("precio", repQ.getPrecio()) );
		
		if(repQ.getObs() != null)
			c.add( Restrictions.eq("observaciones", repQ.getObs() ));
		
		c = c.addOrder(Order.desc("id"));
		
		List<CenDefaultDO> reparaciones = (List<CenDefaultDO>)c.list();
		
		for (CenDefaultDO fenReparacionDO : reparaciones) 
		{
			res.add(getCObj((FenReparacionDO) fenReparacionDO));
		}
		
		session.getTransaction().commit();
		return res;
	}

	public List<CenDefaultCObj> getList(int startIndex, int pageSize)
	{
		Session session = sessionFactory.getCurrentSession();
		session.beginTransaction();
		
		List<CenDefaultCObj> res = new ArrayList<CenDefaultCObj>();
		Criteria c = session.createCriteria(FenReparacionDO.class);
		c.setFirstResult(startIndex);
		c.setFetchSize(pageSize);
		
		List<CenDefaultDO> clientes = c.list();
		
		for (CenDefaultDO fenReparacionDO : clientes) 
		{
			res.add(getCObj((FenReparacionDO) fenReparacionDO));
		}
		
		session.getTransaction().commit();
		return res;
	}

	public int getSize() {
		Session session = sessionFactory.getCurrentSession();
		session.beginTransaction();
		int res = (Integer)session.createCriteria(FenReparacionDO.class).setProjection(Projections.rowCount()).uniqueResult();
		session.getTransaction().commit();
		return res;
	}

}
